package com.jwong.grpc.customheader;

import io.grpc.*;

// 用于在 Channel 传出调用之前拦截它们的接口。
// 实现者使用这种机制将横切行为添加到 Channel 和 Stub 实现。此类行为的常见示例包括：
// 1.强制执行有效的身份凭据验证
// 2.对调用行为进行日志记录或监控
// 3.将调用委托给其他服务器
public class HeaderClientInterceptor implements ClientInterceptor {

    static final Metadata.Key<String> CUSTOM_HEADER_KEY =
            Metadata.Key.of("custom_client_header_key", Metadata.ASCII_STRING_MARSHALLER);

    @Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,
                                                               CallOptions callOptions,
                                                               Channel next) {
        return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
            @Override
            public void start(ClientCall.Listener<RespT> responseListener, Metadata headers) {
                /* 设置自定义Header */
                headers.put(CUSTOM_HEADER_KEY, "customRequestValue");
                super.start(new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(responseListener) {
                    @Override
                    public void onHeaders(Metadata headers) {
                        // 如果不需要从服务器接收标头，您可以直接使用 io.grpc.stub.MetadataUtilsattachHeaders 发送标头
                        System.out.println("header received from server:" + headers);
                        super.onHeaders(headers);
                    }
                }, headers);
            }
        };
    }
}
